package org.yds.quality.function;

import com.googlecode.aviator.runtime.function.AbstractFunction;
import com.googlecode.aviator.runtime.type.AviatorJavaType;
import com.googlecode.aviator.runtime.type.AviatorLong;
import com.googlecode.aviator.runtime.type.AviatorObject;

import java.util.List;
import java.util.Map;

public class Sum2Function extends AbstractFunction {

    @Override
    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject listObj, AviatorObject functionObj) {
        // 获取参数值（假设传入的是一个 List）
        List<?> list = (List<?>) listObj.getValue(env);

        // 初始化总数
        long total = 0;
        int limit = (int) arg1.getValue(env);
        if (functionObj == null) {
            throw new IllegalArgumentException("functionObj 不能为 null");
        }
        if (env == null) {
            throw new IllegalArgumentException("env 不能为 null");
        }
        // 遍历 List
        for (Object item : list) {
            if (item instanceof Map) {
                Map<String, Integer> map = (Map<String, Integer>) item;
                int size = (map.getOrDefault("size", 0)).intValue();

                if (functionObj instanceof AviatorJavaType) {
                    // 如果 functionObj 是 AviatorJavaType，提取其值
                    Object rawFunction = ((AviatorJavaType) functionObj).getValue(env);
                    if (rawFunction == null) {
                        throw new IllegalArgumentException("rawFunction 不能为 null");
                    }
                    if (rawFunction instanceof AbstractFunction) {
                        // 如果提取的值是 AbstractFunction，调用其 call 方法
                        AviatorObject result = ((AbstractFunction) rawFunction).call(env, AviatorLong.valueOf(size), AviatorLong.valueOf(limit));
                        total += ((Number) result.getValue(env)).longValue();
                    } else {
                        // 如果提取的值不是 AbstractFunction，抛出异常
                        throw new IllegalArgumentException("传入的对象不是 AbstractFunction 类型，实际类型为: " + rawFunction.getClass().getName());
                    }
                } else if (functionObj instanceof AbstractFunction) {
                    // 如果 functionObj 直接是 AbstractFunction，调用其 call 方法
                    AviatorObject result = ((AbstractFunction) functionObj).call(env, AviatorLong.valueOf(size), AviatorLong.valueOf(limit));
                    total += ((Number) result.getValue(env)).longValue();
                } else {
                    // 如果 functionObj 是其他类型，抛出异常
                    throw new IllegalArgumentException("传入的对象类型不支持，实际类型为: " + functionObj.getClass().getName());
                }
            }
        }

        // 返回累加后的总数
        return AviatorLong.valueOf(total);
    }

    @Override
    public String getName() {
        return "Sum2"; // 函数名称
    }
}
